#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#define int long long
#define x first
#define y second
using namespace std;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;
int dp[N];
//dp[i]表示亲密值不超过i的所有可能种数
//分为两种情况 1.最后一次约会刚好到达i，那么最后一次约会前的亲密值必须是小于等于(i - k),这种情况可能种数为dp[i - k]
//2.最后一次约会后还是小于i，这种情况可能种数为dp[i - 1]
//故状态转移方程为dp[i] = dp[i - k] + dp[i - 1]
void solve()
{
    int n,k;
    cin >> n >> k;
    for(int i = 0; i < k; i++) dp[i] = 1;
    for(int i = k; i <= n; i++)
    {
        dp[i] = (dp[i - k] + dp[i - 1]) % mod;
    }
    cout << dp[n] % mod << endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    int t = 1;
    /* cin >> t; */
    while(t -- )
    solve();
    return 0;
}